/**
 * @desc aes加解密
 */
'use strict'
const CryptoJS = require('crypto-js')

const DEFAULT_KEY = 'abc123'

/**
 * @description 加密
 * @param {any} value 要加密的数据
 * @param {string?} key 指定'key'
 */
const encrypt = (value, key = DEFAULT_KEY) => {
  try {
    // 如果是字符串类型,需要先用引号包裹
    const str = typeof value === 'string' ? `"${value}"` : JSON.stringify(value)
    const ciphertext = CryptoJS.AES.encrypt(str, key)
    const encrypted = ciphertext.toString()
    return encrypted
  } catch (err) {
    console.error('aes 加密失败', err)
    // 失败默认返回空字符串,保证解密时不会报错
    return ''
  }
}

/**
 * @description 解密
 * @param {string} str 被加密的字符串
 * @param {string?} key 指定'key'
 */
const decrypt = (str, key = DEFAULT_KEY) => {
  try {
    const bytes = CryptoJS.AES.decrypt(str, key)
    const plaintext = bytes.toString(CryptoJS.enc.Utf8)
    // 如果解密的结果是空字符串,则无法使用JSON.parse,直接返回即可
    const decrypted = plaintext === '' ? '' : JSON.parse(plaintext)

    return decrypted
  } catch (err) {
    console.error('aes 解密失败')
    return null
  }
}

module.exports = { encrypt, decrypt }
